package xyz.lwm.lazycat.aop;

import xyz.lwm.lazycat.utility.Assert;

import java.lang.reflect.Proxy;

/**
 * Aop 工具类
 *
 * @author lwm
 */
public abstract class AopUtil {

    /**
     * 判断是否是 lazycat aop 代理对象
     *
     * @param target 目标对象
     * @return true: 是 aop 代理对象
     */
    public static boolean isAopProxy(Object target) {
        return target instanceof LazycatProxy;
    }

    /**
     * 判断是否是 JDK 代理对象
     *
     * @param target 目标对象
     * @return true: 是 JDK 代理对象
     */
    public static boolean isJdkProxy(Object target) {
        return Proxy.isProxyClass(target.getClass());
    }

    /**
     * 获取原始对象
     *
     * @param target 目标对象
     * @return 原始对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T unwrap(T target) {
        if (AopUtil.isAopProxy(target)) {
            Object orig = ((LazycatProxy) target).getTarget();
            Assert.isTrue(orig != null, "Original object cannot be null for aop");
            return unwrap((T) orig);
        } else {
            return target;
        }
    }

}
